// 函数的定义

// js定义函数
// function run(){

// }

// let run1 = function(){

// }

// ts函数定义,可以指定函数类型
// function run():number{   // 返回值必须是数值型
//     return 123;  // 正确
//     // return "123"; // 错误
// }
// run();

// function run():string{   // 返回值必须是字符串
//     return "123";  // 正确
//     // return 123; // 错误
// }
// run();

// function run():boolean{   // 返回值必须是布尔型
//     return true;  // 正确
//     // return "123"; // 错误
// }
// run();

// function run():void{   

// }
// run();


// 函数的可选参数

// js:

// function run (name:string,age:number){
//     console.log(name);
//     console.log(age);
// }
// run("三藏");  //会输出值   age是undefined

// function run(name:string,age:number):string{
//     return name+age;
// }
// console.log(run("张三")); //会输出值   张三undefined


// ts:
// 必传参数  可选参数
// name是必传参数   age有问号是可选参数
// function run(name:string,age?:number){
//     console.log(name);
//     console.log(age);
// }
// run("张三");  // 会输出值   age是undefined


// function run(name:string,age?:number){
//     console.log(name);
//     console.log(age);
// }
// run("李四");


// function run(name:string,age?:number){
//     console.log(name);
//     console.log(age);
// }
// run("张三","李四");


// 给函数的参数指定类型
// function run(num1: number, num2: number): number {   // 返回值是数值型,参数也必须是数值型
//     return num1 + num2;
// }
// console.log(run(1,2)); // 输出3  // 正确
// console.log(run(1,"2")); // 输出12  //错误


// function run(num1: number, num2: number): number { 
//     return num1 + num2;
// }
// console.log(run(123,456));


// function run(num1: number, num2: number): number {
//     return num1 + num2;
// }
// console.log(run(100,200));



// let v1: any = document.getElementById("value1");
// let v2: any = document.getElementById("value2");
// let btn: any = document.getElementById("btn");
// let result: any = document.getElementById("result");
// // console.log(v1.value,v2.value);
// function getResult(num1: number, num2: number): number {
//     return num1 + num2;
// }
// // console.log(getResult(1, 2));
// btn.onclick = function (): void {
//     let a: number = v1.value;
//     let b: number = v2.value;

//     result.innerHTML = getResult(a, b);
// }


// 可选参数必须放在必传参数的后面

// function temp(name:string,age?:number){

// }


// 给函数设置默认值

// function getResult(name:string,age:number=21):any{
//     return name + age;
// }
// console.log(getResult("张三"));


// function getResult(name:string,age:number=20):any{
//     return name + age;
// }
// console.log(getResult("李四",15));


// function getResult(name:string,age:number=18):any{
//     return name + age;
// }
// console.log(getResult("王五"));


// function getResult(name:string,age:number=18):any{
//     return name + age;
// }
// console.log(getResult("刘刘",21));


// 设置函数的剩余参数

// function result(a:number,...array:number[]){
//     let sum:number=a;  // a代表1
//     for(let i=0;i<array.length;i++){
//         sum+=array[i];
//     }
//     console.log(sum);
// }
// result(1,2,3,4,5,6);


// function result(a:number,...array:number[]){
//     let sum:number=a;
//     for(let i=0;i<array.length;i++){
//         sum+=array[i];
//     }
//     console.log(sum);
// }
// result(1,2,3,4,5,6);


// function result(a:number,...array:number[]){
//     let sum:number=a;
//     for(let i=0;i<array.length;i++){
//         sum+=array[i];
//     }
//     console.log(sum);
// }
// result(1,2,3,4,5,6);



// 函数定义

// 基本方式:直接在定义函数实体语句中,指定参数和返回值类型
// let add: (x: number, y: number) => number;
// add = (x: number, y: number): number => x + y;   // 正确
// add = (x: string, y: string): number => x + y;   // 错误



// let add: (x: number, y: number) => number;
// add = (x: number, y: number): number => x + y;


// let add: (x: number, y: number) => number;
// add = (x: number, y: number): number => x + y;


// let add: (x: number, y: number) => number;
// add = (x: number, y: number): number => x + y;


// let add: (x: number, y: number) => number;
// add = (x: number, y: number): number => x + y;



// 类型别名:这种方式是比较推荐的写法,比较简洁清晰
// type Add = (x: number, y: number) => number;
// let add: Add = (arg1: number, arg2: number): number => arg1 + arg2;
// console.log(add(1, 2));


// type Arr = (x: number, y: number) => number;
// let arr: Arr = (x: number, y: number): number => x + y;
// console.log(arr(123, 456));


// type Add = (x: number, y: number) => number;
// let add: Add = (x: number, y: number): number => x + y;
// console.log(add(11, 22));






// 基本方式:直接在定义函数实体语句中,指定参数和返回值类型

// function add(x:number):number{
//     return x;
// }

// let add1 = (x:number):number => x;


// function add(x:number):number{
//     return x;
// }

// let add1 = (x:number):number => x;


// function add(x:number):number{
//     return x;
// }

// let add1 = (x:number):number => x;


// function add(x:number):number{
//     return x;
// }

// let add1 = (x:number):number => x;


// function add(x:number):number{
//     return x;
// }

// let add1 = (x:number):number => x;


// 类型别名:这种方式是比较推荐的写法,比较简洁清晰
// type Add = (x: number, y: number) => number;

// let add: Add = (x: number, y: number) => x + y;
// console.log(add(1,2));


// type Add = (x: number, y: number) => number;
// let add: Add = (x: number, y: number) => x + y;
// console.log(add(1,2));

// type Add = (x: number, y: number) => number;
// let add: Add = (x: number, y: number) => x + y;
// console.log(add(1,2));

// type Add = (x: number, y: number) => number;
// let add: Add = (x: number, y: number) => x + y;
// console.log(add(1,2));

// type Add = (x: number, y: number) => number;
// let add: Add = (x: number, y: number) => x + y;
// console.log(add(1,2));